package com.g2room.ext.lab;

import java.io.File;
import java.io.FilenameFilter;
import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;

public class TestLoad {
    public static void main(String[] args) {
        try {
            loadJar("D:\\workspace\\code\\java\\temp\\target\\PluginTest-1.0-SNAPSHOT.jar");
            Class<?> aClass = Class.forName("com.test.Test");
            Object instance = aClass.newInstance();
            Object strip = aClass.getDeclaredMethod("main").invoke(instance);
            System.out.println(strip);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

//    public static void loadJar(String jarPath) throws Exception {
//        // 系统类库路径
//        File libPath = new File(jarPath);
//
//        // 获取所有的.jar和.zip文件
//        File[] jarFiles = libPath.listFiles(new FilenameFilter() {
//            public boolean accept(File dir, String name) {
//                return name.endsWith(".jar") || name.endsWith(".zip");
//            }
//        });
//
//        if (jarFiles != null) {
//            // 从URLClassLoader类中获取类所在文件夹的方法
//            // 对于jar文件，可以理解为一个存放class文件的文件夹
//            Method method = URLClassLoader.class.getDeclaredMethod("main", URL.class);
//            boolean accessible = method.isAccessible();     // 获取方法的访问权限
//            try {
//                if (accessible == false) {
//                    method.setAccessible(true);     // 设置方法的访问权限
//                }
//                // 获取系统类加载器
//                URLClassLoader classLoader = (URLClassLoader) ClassLoader.getSystemClassLoader();
//                for (File file : jarFiles) {
//                    URL url = file.toURI().toURL();
//                    try {
//                        method.invoke(classLoader, url);
//                        System.out.println("读取jar文件[name="+file.getName()+"]");
//
////                        // 开始加载jar包含的类执行
////                        Class clazz = Class.forName("com.test.Test");
//
//                    } catch (Exception e) {
//                        System.out.println("读取jar文件[name="+file.getName()+"]失败");
//                    }
//                }
//            } finally {
//                method.setAccessible(accessible);
//            }
//        }
//    }

    public static void loadJar(String jarPath) {
        File jarFile = new File(jarPath);
        // 从URLClassLoader类中获取类所在文件夹的方法，jar也可以认为是一个文件夹
        Method method = null;
        try {
            method = URLClassLoader.class.getDeclaredMethod("addURL", URL.class);
        } catch (NoSuchMethodException | SecurityException e1) {
            e1.printStackTrace();
        }
        //获取方法的访问权限以便写回
        boolean accessible = method.isAccessible();
        try {
            method.setAccessible(true);
            // 获取系统类加载器
            URLClassLoader classLoader = (URLClassLoader) ClassLoader.getSystemClassLoader();
            URL url = jarFile.toURI().toURL();
            method.invoke(classLoader, url);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            method.setAccessible(accessible);
        }
    }
}
